﻿#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <unordered_map>
#include <functional>
#include <signal.h>
#include "eventloop.h"
#include "acceptor.h"
#include "connection.h"
#include "loopthreadpool.h"

static const std::string defaultip = "0.0.0.0";

class NetWork {
public:
    NetWork() {
        //
        signal(SIGPIPE, SIG_IGN);
    }
};

// 声明为全局静态变量
static NetWork s_netWork;

class TcpServer
{
private:
    // 监听管理
    uint16_t m_port;
    EventLoop m_baseloop; // 主线程loop
    Acceptor m_acceptor;  // 监听对象
    // 连接管理
    int m_timeout;
    bool m_enableInactiveRelease;
    uint64_t m_cid;                                      // 连接id and 任务id
    std::unordered_map<uint64_t, ConnectionPtr> m_conns; // 保存所有的连接对应的share_ptr对象
    LoopThreadPool m_pool;                               // 从属线程池
    using ConnectCallback = std::function<void(const ConnectionPtr &)>;
    using MessageCallback = std::function<void(const ConnectionPtr &, Buffer *)>;
    using CloseCallback = std::function<void(const ConnectionPtr &)>;
    using AnyCallback = std::function<void(const ConnectionPtr &)>;
    ConnectCallback m_connectCallback;
    MessageCallback m_messageCallback;
    CloseCallback m_closeCallback;
    AnyCallback m_anyCallback;
    // 任务管理
    using TaskFunc_t = std::function<void()>;

private:
    // 服务器内部回调(从m_conns删除ConnectionPtr)
    void _handleSvrClose(const ConnectionPtr& cptr);
    void handleSvrClose(const ConnectionPtr& cptr);
    // 新连接回调
    void newConnection(int newfd);
    // 子函数addtimerTask
    void _addTimerTask(const TaskFunc_t &task, int timeout);
public:
    TcpServer(uint16_t port, const std::string& ip = defaultip);
    ~TcpServer();
    // 启动服务器
    void start();
    // 设置线程池大小
    void setThreadCount(int threadCount);
    // 启动非活跃销毁，启动后，后续的所有连接都会启动非活跃销毁
    void enableInactiveRelease(int timeout);
    // 添加定时任务
    void addTimerTask(const TaskFunc_t &task, int timeout);
    // 设置连接回调
    void setConnectCallback(const ConnectCallback &cb);
    // 设置消息回调
    void setMessageCallback(const MessageCallback &cb);
    // 设置关闭回调
    void setCloseCallback(const CloseCallback &cb);
    // 设置任意回调
    void setAnyCallback(const AnyCallback &cb);
};

#endif // TCPSERVER_H
